/*
*https://leetcode.cn/problems/max-consecutive-ones-iii/description/
*1004. 最大连续1的个数 III
*medium, 彭珵 2024.9.2
* 滑动窗口
*/

#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left = 0; // 初始化左指针，表示当前窗口的起始位置
        int right = 0; // 初始化右指针，表示当前窗口的结束位置
        int countZero = 0; // 记录当前窗口中 0 的数量
        int maxLength = 0; // 记录最长只包含 1 的子数组的长度

        // 遍历整个数组
        while (right < nums.size()) {
            // 如果当前元素是 0，增加 0 的计数
            if (nums[right] == 0) {
                countZero++;
            }

            // 当 0 的数量超过 k 时，移动左指针
            while (countZero > k) {
                // 如果左指针指向的元素是 0，减少 0 的计数
                if (nums[left] == 0) {
                    countZero--;
                }
                left++; // 移动左指针，缩小窗口
            }

            // 更新最长只包含 1 的子数组的长度
            // right - left + 1 是当前窗口的长度
            maxLength = max(maxLength, right - left + 1);
            right++; // 移动右指针，扩展窗口
        }

        return maxLength; // 返回最长只包含 1 的子数组的长度
    }
};